// 定义接口的基础地址
let baseUrl = "";

if (process.env.NODE_ENV === "development") {
  baseUrl = "https://kong-test.parklanelimo.com.cn";
  console.log("开发环境"); // 发布到生产环境时，此处代码会被摇树移除掉。
} else {
  baseUrl = "https://kong.parklanelimo.com.cn";
  console.log("生产环境");
}

export default baseUrl;
//测试环境
// let baseUrl = "https://kong-test.parklanelimo.com.cn";

// 新 线上环境

const determineURLType = url => {
  return baseUrl;
};
// 获取请求头的函数（从本地存储获取多个键值设置请求头）
const getHeaders = () => {
  return new Promise((resolve, reject) => {
    let headers = {};
    // 假设本地存储中有 token 和 user - id 两个键用于设置请求头
    const token = uni.getStorageSync("token");
    // const userId = uni.getStorageSync('user-id');
    if (token) {
      headers["Authorization"] = `${token}`;
    }
    // if (userId) {
    //     headers['user - id'] = userId;
    // }
    resolve(headers);
  });
};

// 封装 GET 请求
const getRequest = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    // 获取请求头信息
    const baseURLForRequest = determineURLType(url);
    getHeaders()
      .then(headers => {
        uni.request({
          // 请求的 URL 是基础地址加上具体的接口地址
          url: baseURLForRequest + url,
          // 使用 GET 方法
          method: "GET",
          // 请求携带的数据
          data: data,
          // 请求头信息
          header: uni.getStorageSync("token") ? headers : "",
          success: res => {
            // 如果响应数据存在且响应码为 0，表示请求成功
            if (res.data && res.data.code === 200) {
              // 从响应数据中提取需要的数据并作为 Promise 的成功结果返回
              resolve(res.data);
            } else if (res.data && res.data.code === 403) {
              uni.clearStorageSync();
              uni.navigateTo({
                url: "/pages/login/login",
              });
            } else {
              uni.showToast({
                title: res.data.msg,
                icon: "none",
              });
              // 如果响应数据存在但响应码不为 0，将响应数据作为 Promise 的失败结果返回
              reject(res.data);
            }
          },
          fail: err => {
            // 如果请求失败，将错误信息作为 Promise 的失败结果返回
            reject(err);
          },
        });
      })
      .catch(error => {
        // 如果获取请求头信息失败，将错误信息作为 Promise 的失败结果返回
        reject(error);
      });
  });
};

// 封装 POST 请求的函数，新增 isFormData 参数用于标识是否为表单数据格式
const postRequest = (url, data = {}, isFormData = false) => {
  return new Promise((resolve, reject) => {
    // 获取请求头信息
    getHeaders()
      .then(headers => {
        //
        if (url.includes("/bm/login/loginByWechat")) {
          headers["authorization"] =
            "Basic WIpyt9R8zxKGLWnYJmuymVuupWA9xf/RA5dNl8IVWBs=";
        }
        if (isFormData) {
          // 如果是表单数据格式，设置请求头的 Content - Type 为 application/x - www - form - urlencoded
          headers["Content-Type"] = "application/x-www-form-urlencoded";

          let formData = "";
          // 将数据转换为 application/x - www - form - urlencoded 格式
          for (let key in data) {
            if (formData !== "") {
              formData += "&";
            }
            formData +=
              encodeURIComponent(key) + "=" + encodeURIComponent(data[key]);
          }
          data = formData;
        } else {
          // 如果是 JSON 格式，设置请求头的 Content - Type 为 application/json
          headers["Content-Type"] = "application/json";
        }
        const baseURLForRequest = determineURLType(url);
        // 发送 POST 请求
        uni.request({
          // 请求的 URL 是基础地址加上具体的接口地址
          url: baseURLForRequest + url,
          // 使用 POST 方法
          method: "POST",
          // 请求携带的数据
          data: data,
          // 请求头信息
          header: headers,
          success: res => {
            // 如果响应数据存在且响应码为 0，表示请求成功
            if (
              (res.data && res.data.code === 200) ||
              res.data.bizCode === "00000"
            ) {
              // 从响应数据中提取需要的数据并作为 Promise 的成功结果返回
              resolve(res.data);
            } else if (res.data && res.data.code === 403) {
              uni.clearStorageSync();
              uni.navigateTo({
                url: "/pages/login/login",
              });
            } else {
              uni.showToast({
                title: res.data.msg,
                icon: "none",
              });
              // 如果响应数据存在但响应码不为 0，将响应数据作为 Promise 的失败结果返回
              reject(res.data);
            }
          },
          fail: err => {
            // 如果请求失败，将错误信息作为 Promise 的失败结果返回
            reject(err);
          },
        });
      })
      .catch(error => {
        // 如果获取请求头信息失败，将错误信息作为 Promise 的失败结果返回
        reject(error);
      });
  });
};

// 封装 DELETE 请求
const delRequest = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    // 获取请求头信息
    getHeaders()
      .then(headers => {
        // 如果是 JSON 格式，设置请求头的 Content - Type 为 application/json
        headers["Content-Type"] = "application/json";
        const baseURLForRequest = determineURLType(url);
        // 发送 POST 请求
        uni.request({
          // 请求的 URL 是基础地址加上具体的接口地址
          url: baseURLForRequest + url,
          // 使用 POST 方法
          method: "DELETE",
          // 请求携带的数据
          data: data,
          // 请求头信息
          header: headers,
          success: res => {
            // 如果响应数据存在且响应码为 0，表示请求成功
            if (
              (res.data && res.data.code === 200) ||
              res.data.bizCode === "00000"
            ) {
              // 从响应数据中提取需要的数据并作为 Promise 的成功结果返回
              resolve(res.data);
            } else {
              // 如果响应数据存在但响应码不为 0，将响应数据作为 Promise 的失败结果返回
              reject(res.data);
            }
          },
          fail: err => {
            // 如果请求失败，将错误信息作为 Promise 的失败结果返回
            reject(err);
          },
        });
      })
      .catch(error => {
        // 如果获取请求头信息失败，将错误信息作为 Promise 的失败结果返回
        reject(error);
      });
  });
};

// 封装上传文件请求的函数
const uploadFileRequest = (url, filePath, name, formData = {}) => {
  return new Promise((resolve, reject) => {
    const baseURLForRequest = determineURLType(url);

    // 获取请求头信息
    getHeaders()
      .then(headers => {
        // 执行文件上传请求
        uni.uploadFile({
          // 请求的 URL 是基础地址加上具体的接口地址
          url: baseURLForRequest + url,
          // 要上传的文件路径
          filePath: filePath,
          // 文件对应的 key 值
          name: name,
          // 其他表单数据
          formData: formData,
          // 请求头信息
          header: {
            ...headers,
            "Content-Type": "multipart/form-data",
          },
          success: res => {
            const result = JSON.parse(res.data);
            // 如果响应数据存在且响应码为 0，表示请求成功
            if (result.code === 200) {
              // 从响应数据中提取需要的数据并作为 Promise 的成功结果返回
              resolve(result);
            } else {
              uni.$u.toast(result.msg);
              // 如果响应数据存在但响应码不为 0，将响应数据作为 Promise 的失败结果返回
              reject(result);
            }
          },
          fail: err => {
            // 如果请求失败，将错误信息作为 Promise 的失败结果返回
            reject(err);
          },
        });
      })
      .catch(error => {
        // 如果获取请求头信息失败，将错误信息作为 Promise 的失败结果返回
        reject(error);
      });
  });
};

// 封装检查登录状态的请求
const checkLoginStatusRequest = () => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: `${baseUrl}/checkLoginStatus`,
      method: "GET",
      success: res => {
        if (res.data && res.data.code === 0) {
          resolve(res.data.isLoggedIn);
        } else {
          reject(res.data);
        }
      },
      fail: err => {
        reject(err);
      },
    });
  });
};
// 导出封装好的函数，以便在其他模块中使用
export {
  getRequest,
  postRequest,
  checkLoginStatusRequest,
  uploadFileRequest,
  delRequest,
};
